两大图灵奖得主力作:计算机架构的新黄金时代
来源|Communications of ACM
撰文|John L. Hennessy, David A. Patterson
编译|机器之心
John Hennessy 和 David Patterson 是 2017 年图灵奖获得者,目前这两位学者都供职于谷歌,前者是谷歌母公司 Alphabet 的董事会主席,后者任谷歌杰出工程师,致力于研究机器学习和人工智能。他们更为人所知的就是共同完成的计算机系统结构学科「圣经」《计算机体系结构:量化研究方法》了。
本文《计算机架构的新黄金时代》是两人于 2019 年新发表的文章,完整介绍了计算机芯片的发展历程,以及所有架构的未来趋势,值得所有希望了解硬件架构的人阅读。
图注:2019 年 2 月刊发
2018 年 6 月 4 日,我们做的图灵讲座(Turing Lecture)是以回顾自 20 世纪 60 年代以来计算机架构的发展开头的。除了那个回顾,我们还在讲座中介绍了当前的难题和未来机遇。我们还预测未来十年计算机架构领域将迎来下一个黄金时代,就像 20 世纪 80 年代我们所开展的那些帮助我们获得图灵奖的研究一样——必将改善计算机的成本、能源、安全以及性能。
「不能铭记过去的人注定要重蹈覆辙。」——George Santayana,1905
软件与硬件是通过一个叫指令集架构(Instruction Set Architecture, ISA)的词汇表进行对话的。在 1960 年代早期,IBM 有四个互不兼容的计算机产品线,每个都有自己的 ISA、软件堆栈、I/O 系统和利基市场(分别针对的是小型企业、大型企业、科研和实时应用)。包括 ACM 图灵奖获得者 Fred Brooks, Jr. 在内的 IBM 工程师都认为他们可以创造一种能有效统一所有这四种 ISA 基础的单个 ISA。
他们需要一种技术解决方案,让便宜的 8 位数据通路计算机与高速的 64 位数据通路计算机都能共用一个 ISA。这些数据通路是处理器的「身体」,它们在其中执行算术运算但相对而言较容易「变宽」或「变窄」。对于那时以及现在的计算机设计者来说,最大的难题是处理器的「大脑」——控制硬件。受软件编程的启发,计算先驱和图灵奖获得者 Maurice Wilkes 提出了简化控制的方法。控制可被描述为一个二维数组,他称之为「控制存储器(control store)」。这个数组的每一列都对应于一条控制线,每一行都是一个微指令(microinstruction),而编写微指令则被称为微编程(microprogramming)。一个控制存储器包含一个用微指令编写的 ISA 解释器,所以执行一个常规指令需要多个微指令。这种控制存储器是通过内存实现的,成本比逻辑门要低得多。
表 1 列出了 IBM 在 1964 年 4 月 7 日宣布的新 System/360 ISA 的 4 种型号。数据通路的变化范围有 8 倍,内存容量的变化范围有 16 倍,时钟频率是 4 倍,性能是 50 倍,成本接近 6 倍。成本最高的计算机的控制存储器最宽,因为更复杂的数据通路使用更多控制线。成本最低的计算机因为硬件更简单而有更窄的控制存储器,但因为它们需要更多时钟周期来执行一个 System/360 指令,所以需要更多微指令。
表 1:IBM System/360 系列四个型号的特性;IPS 表示每秒执行指令数。
在微编程的推动下,IBM 将公司的未来押在了这款新 ISA 上,寄希望其能革新计算行业,为 IBM 赢得回报。IBM 成功主宰了这一市场,IBM 计算机家族的大型机后裔在推出 55 年后仍然每年创造着 100 亿美元的收入。
正如我们反复看到的那样,尽管市场并不是评判各种技术问题的完美裁判,但鉴于架构和商业计算机之间联系紧密,市场才能最终决定那些往往需要大量工程投入的架构创新是否成功。
集成电路,CISC,432,8086,IBM PC
当计算机开始使用集成电路时,摩尔定律意味着控制存储器可以变大很多。更大的内存反过来又意味着允许使用更复杂的 ISA。要知道,数字设备公司(Digital Equipment Corp.)在 1977 年推出的 VAX-11/780 的控制存储器为 5120 字×96 位,而其前一代仅有 256 字× 56 位。
某些制造商选择开放微编程功能,让选定的客户能添加定制功能,他们称之为「可写控制存储器(WCS)」。最有名的 WCS 计算机是 Alto,这是图灵奖得主 Chuck Thacker 和 Butler Lampson 及其同事于 1973 年一起为施乐(Xerox)帕洛阿托研究中心开发的。这实际上是第一款个人计算机(PC),配备有首款位映像显示器(bit-mapped display)和首个以太网局域网。用于这种全新显示器和网络的设备控制器是存储在一个 4096 字×32 位 WCS 中的微程序。
1970 年代的微处理器(比如英特尔的 8080)仍处于 8 位时代,主要依靠汇编语言编写程序。互相竞争的设计者会通过添加新的指令来赶超彼此,他们会通过汇编语言示例来展示自己的优势。
戈登·摩尔(Gordon Moore)相信英特尔的下一代 ISA 将会伴随英特尔的一生,因此他聘用了很多聪明的计算机科学博士,并将他们送到波特兰去发明出色的下一代 ISA。英特尔最早命名为 8800 的计算机架构项目雄心勃勃——放在任何时代而言都称得上如此,显然也是 1980 年代最有野心的。它有基于 32 位的寻址能力、面向对象的架构、位长可变的指令以及用时新的编程语言 Ada 编写的自己的操作传统。
可惜这个雄心勃勃的项目几年之后停摆了,迫使英特尔在圣克拉拉开始了一项紧急替换工作,在 1979 年推出了一款 16 位微处理器。英特尔给了新团队 52 周时间来开发新的「8086」ISA 以及设计和构建芯片。鉴于日程紧迫,这个团队实际上是把 8080 的 8 位寄存器和指令集扩展成了 16 位,最后在 3 个常规工作周内只用了10人周的工作量就完成了这款 ISA 的设计。这个团队按时完成了 8086 的开发,但在发布时却没引起什么关注。
英特尔非常幸运,IBM 当时正在开发一款个人计算机来与 Apple II 竞争,并需要一款 16 位微处理器。IBM 之前感兴趣的是 Motorola 68000,其 ISA 与 IBM 360 类似,但却落后于 IBM 激进的计划。IBM 转而使用 8086 的 8 位总线版本。IBM 在 1981 年 8 月 12 日推出了这款 PC,希望到 1986 年时能售出 25 万台。而实际上该公司在全球售出了 1 亿台,为这款紧急代换的英特尔 ISA 铺垫了一个非常光明的未来。
英特尔原本的 8800 项目更名了为 iAPX-432,并最终在 1981 年推出,但它需要多块芯片并且存在严重的性能问题。该项目在 1986 年被再次终止,这一年,英特尔在 80386 中对 16 位 8086 ISA 进行了扩展,将其寄存器从 16 位扩展到了 32 位。因此,摩尔的预测就是正确的了——下一代 ISA 确实会和英特尔一样长寿,但市场选择了紧急代换的 8086,而不是专门精心开发的 432。正如 Motorola 68000 和 iAPX-432 两者的设计师都学到的那样:市场往往缺乏耐心。
从复杂指令集到精简指令集计算机
1980 年代早期,人们对更大型控制存储器中大型微程序使用的复杂指令集计算机(CISC)进行了一些研究。Unix 表明即使操作系统也可以使用高级语言编写,关键问题随之变成了「编译器会生成什么指令?」,而不是「编程者会使用什么汇编语言?」。硬件/软件接口的显著改进为架构创新带来了机会。
图灵奖得主 John Cocke 与其同事为小型计算机开发了更简单的 ISA 和编译器。作为实验,他们将自己研究的编译器的目标重新设定为:仅使用 IBM 360 ISA 中简单的 register-register 操作和 load-store 数据传输,避免更复杂的指令。他们发现使用这个简单的子集时,程序运行速度可快达三倍。Emer 和 Clark 发现 VAX 指令中 20% 的指令需要 60% 的微代码(microcode),但这些指令仅在实际执行中占据 0.2% 的时间。
David Patterson 把在 DEC 的一次学术休假投入到了研究减少 VAX 指令中的漏洞上。他认为,如果微处理器制造商遵循更大型计算机的 CISC ISA 设计,则它们需要一种修复微代码漏洞的方法。他为此写了一篇论文,但期刊《Computer》却拒绝接收。审稿人认为,使用如此复杂以至于需要修补的 ISA 开发微处理器是很糟糕的。这次拒稿让作者开始反思 CISC ISA 在微处理器方面的价值。讽刺的是,现代 CISC 微处理器确实需要包含微代码修复机制,但Patterson被拒稿的主要结果是启发他为微处理器开发更简单的 ISA——精简指令集计算机(RISC)。
这些观察和向高级编程语言的流行为 CISC 向 RISC 的过渡带来了机会。首先,RISC 指令被进一步简化,不再需要微代码解释器。RISC 指令通常和微指令一样简单,硬件可以直接执行。第二,之前用于 CISC ISA 的微代码解释器的快速内存被用作了 RISC 指令的缓存(缓存是小而快的内存,临时缓冲近期执行过的指令,因为这样的指令很可能很快就要重新使用。)。第三,基于 Gregory Chaitin 图着色方案的寄存器分配器使编译器可以更加容易地有效使用寄存器,这对这些 register-register ISA 是有利的。最后,摩尔定律意味着 1980 年代单块芯片中已有足以包含完整 32 位数据通路的晶体管以及相应的指令和数据缓存。
在今天的后 PC 时代,x86 的出货量从 2011 年的顶峰每年都会下降约 10%,而 RISC 处理器芯片出货量已经激增到了 200 亿。
例如图 1 展示了 RISC-I 和 MIPS 微处理器,它们分别由 UC 伯克利和斯坦福在 1982 与 1983 年开发,它们展示了 RISC 的优势。这些芯片最终都展示在了顶尖的电路会议上,即 1984 年的 IEEE 国际固态电路会议。这在当时是非常瞩目的成果,因为伯克利和斯坦福的一些研究生能构建某种程度上超越工业届才能构建的微处理器。
图 1:加州大学伯克利分校 RISC-1 和斯坦福大学 MIPS 微处理器。
这些学术界做出的芯片激励了许多公司构建 RISC 微处理器,也是那之后 15 年内最快的芯片。下面的公式解释了处理器的性能:
Time/Program = Instructions / Program x (Clock cycles) / Instruction x Time / (Clock cycle)
DEC 工程师后来表明,更复杂的 CISC ISA 每个程序执行的指令数是 RISC 每个程序的 75%(上式第一项),在使用类似的技术时,CISC 执行每个指令要多消耗 5 到 6 个时钟周期(第二项),使得 RISC 微处理器的速度大约快了 3 倍。
这样的公式在上世纪 80 年代的计算机架构书中还没有,后来我们在 1989 年发表了《计算机体系架构:量化研究方法》一书。子标题表明了该书的主题:使用测量方法和基准进行量化评估,而不是像从前那样依靠架构师的直觉与经验。我们使用的量化方法也受到了图灵奖得主 Donald Knuth 关于算法的书的启发。
VLIW、EPIC、Itanium
下一个 ISA 创新原本应该是要取代 RISC 和 CISC 的。超长指令字(VLIW)及其「表亲」显式并行指令计算机(Explicitly Parallel Instruction Computer, EPIC)使用了宽指令,其中在每条指令中捆绑了多个独立操作。VLIW 和 EPIC 的拥护者当时认为,单个指令如果可以指定六个独立的操作(两个数据传输、两个整型操作和两个浮点操作),并且编译器技术可以有效地将操作分配到六个指令槽,则硬件可以变得更简单。与 RISC 方法一样,VLIW 和 EPIC 将工作量从硬件转移到编译器。
通过合作,英特尔和惠普公司设计了一款基于 EPIC 理念的 64 位处理器来取代 32 位 x86。英特尔和惠普公司对第一款 EPIC 处理器(Itanium)的期望很高,但实际情况与开发商的早期声明并不相符。虽然 EPIC 方法适用于高度结构化的浮点程序,但它很难在具有较低可预测性的缓存丢失或较难预测的分支判断的整型程序上取得高性能。正如 Donald Knuth 后来指出:「Itanium 方法...... 原被认为非常赞,直到事实证明所希望的编译器基本上不可能写出来。」专家们注意到 Itanium 的延迟和表现不佳,并借鉴泰坦尼克号事件重新将其命名为「Itanic」。市场再次失去了耐心,导致 64 位版本的 x86 成为 32 位 x86 的继承者,而不是 Itanium。
好消息是,VLIW 仍然适用于较窄范围的应用程序、小程序、更简单的分支和省略缓存,包括数字信号处理。
PC 和后 PC 时代的 RISC vs. CISC
AMD 和英特尔使用了 500 人的设计团队和顶尖半导体技术来减少 x86 和 RISC 的性能差距。再次受到简单流水线 vs 复杂指令性能优势的启发,指令解码器在运行中将复杂的 x86 指令转换为类似 RISC 的内部微指令。然后 AMD 和英特尔将 RISC 微指令的执行流水线化。RISC 设计师关于提高性能的任何想法,包括分离指令、数据缓存、芯片二级缓存、深度流水线,以及同时获取和执行多个指令等,都被用在 x86 的设计上。AMD 和英特尔在 2011 年 PC 时代的巅峰期出了大约 3 亿 5 千万个微处理器。PC 行业的高产量和低利润同样意味着比 RISC 计算机更低的价格。
鉴于每年全球销售数亿台 PC,PC 软件成为一个巨大的市场。虽然 Unix 市场的软件提供商会为不同的商业 RISC ISA-Alpha、HP-PA、MIPS、Power 和 SPARC 提供不同的软件版本,但 PC 市场却享有单一的 ISA,因此软件开发商提供了「压缩包装」软件,只与 x86 ISA 二进制兼容。2000 年,更大的软件基础、类似的性能和更低的价格使 x86 在台式机和小型服务器市场中占据主导地位。
苹果公司在 2007 年帮助推动了后 PC 时代。智能手机公司不再购买微处理器,而是采用外部公司的设计(包括 ARM 的 RISC 处理器)构建自己的芯片系统(SoC)。移动设备设计人员像对性能一样珍视芯片面积和能效,这不利于 CISC ISA 的设计。此外,物联网的到来大大促进了处理器的数量以及芯片尺寸、功率、成本和性能所需的权衡。这种趋势增加了设计时间和成本的重要性,进一步使 CISC 处理器处于不利地位。在今天的后 PC 时代,x86 出货量自 2011 年达到峰值以来每年下降近 10%,而采用 RISC 处理器的芯片则飙升至 200 亿。如今,99%的 32 位和 64 位处理器都是 RISC。
结束这一历史回顾,我们可以说市场已经解决了 RISC-CISC 的争论。CISC 赢得了 PC 时代的后期阶段,但 RISC 正在后 PC 时代占据主导。几十年来,都没有出现新的 CISC ISA。令我们惊讶的是,在推出 35 年后,今天对于通用处理器来说,最佳的 ISA 仍然是 RISC。
处理器架构的当前挑战
「如果一个问题无解,那它可能并不是一个问题,而是一个事实;不是被我们来解决,而是被时间的推移来解决。」—Shimon Peres
虽然前面的部分聚焦在指令集架构(ISA)设计上,大部分计算机架构师并不设计新的 ISA,而是在现有的实现技术中实现现有的 ISA。自 20 世纪 70 年代后期以来,选择的技术一直是基于金属氧化物半导体(MOS)的集成电路,首先是 n 型金属氧化物半导体(nMOS),然后是互补金属氧化物半导体(CMOS)。摩尔的预测中捕捉到的 MOS 技术惊人的进步率一直促使架构师设计更积极的方法来为给定的 ISP 实现更好的性能。在 1965 年的最初预测中,摩尔称晶体管密度会每年翻一番;1975 年,他又预计每两年翻一番。该预测最终被称为摩尔定律。因为晶体管密度呈二次增长,而速度只呈线性增长,架构师实际上使用更多晶体管来实现更好的性能。
摩尔定律和登纳德缩放定律的终结
尽管摩尔定律已经持续了几十年(见图 2),但在 2000 年左右开始放缓。到了 2018 年,根据摩尔定律得出的预测与当下实际能力差了 15 倍。根据当前预测,这一差距将持续拉大,因为 CMOS 技术方法已经接近极限。
图 2. 每个英特尔微处理器上的晶体管数量 vs. 摩尔定律
伴随摩尔定律是由罗伯特·登纳德(Robert Dennard)预测的登纳德缩放定律(Dennard scaling)。他指出,随着晶体管密度的增加,每个晶体管的能耗将降低,因此硅芯片上每平方毫米上的能耗几乎保持恒定。由于每平方毫米硅芯片的计算能力随着技术的迭代而不断增强,计算机将变得更加节能。登纳德缩放定律从 2007 年开始大幅放缓,2012 年左右接近失效(见图 3)。
图 3. 每个芯片上的晶体管及每平方毫米的能耗。
1986 年至 2002 年间,指令级并行(ILP)是提高性能的主要架构方法。而且随着晶体管速度的提高,其性能每年能提高 50% 左右。登纳德缩放定律的终结意味着工程师必须找到更加高效的并行化利用方法。
要理解为什么 ILP 的增加会导致芯片能效大大降低,可以看一看 ARM、英特尔、AMD 当前推出的处理器核。假设该芯片有一个 15 阶段的流水线,每个时钟周期可以发送 4 条指令。那么在任意一个时刻,整个工作流程中至多有 60 条指令,包括大约 15 个分支,它们代表了大约 25% 的执行指令。为了打满流水线,需要预测分支,并根据推测将代码放入工作流程中以便执行。推测的使用是 ILP 高性能和芯片低能效的源头所在。如果分支预测完美,推测就能提高 ILP 性能,但能耗会增加一些——甚至可能节约能耗——但如果分支预测出现失误,处理器就必须抛弃错误的推测指令,其计算工作及所耗能量就会付之东流。处理器的内部状态也必须恢复到错误预测分支之前的状态,这将花费额外的时间和能量。
要理解这种设计的挑战性有多高,可以考虑一下正确预测 15 个分支结果的难度。如果处理器要将做无用功的时间限制在 10%,那么它必须在正确预测每个分支的准确率达到 99.3% 。很少有通用程序能够如此准确地预测分支。
要理解这些无用功叠加起来是什么结果,可以参见图 4 中的数据。图 4 显示了有效执行的部分指令,这部分指令由于处理器推测错误而变得无用。在英特尔酷睿 i7 基准测试上,19% 的指令都被浪费了,但能耗的浪费情况更加严重,因为处理器必须利用额外的能量才能在推测失误时恢复原来的状态。这样的度量导致许多人得出结论,架构师需要一种不同的方法来实现性能改进。于是多核时代就这样诞生了。
图 4. 在各种 SPEC 整型数基准上,英特尔酷睿 i7 浪费的指令占完成指令总数的百分比。
多核将识别并行性和决定如何利用并行性的责任转移给程序员和语言系统。多核并不能解决由登纳德缩放定律终结带来的能效计算挑战。每个活跃的核都会消耗能量,无论其对计算是否具有有效贡献。一个主要的障碍可以用阿姆达尔定律(Amdahl's Law)表述,该定理认为,并行计算机的加速受限于串行计算的部分。这一定律的重要性参见图 5。图中显示,假设只在一个处理器上执行时的串行执行的部分所占比例不同,那么与单个内核相比,最多 64 个内核的应用程序运行速度能快多少。例如,如果只有 1% 的时间是串行的,那么 64 核配置可加速大约 35 倍,但所需能量与 64 个处理器成正比,因此大约有 45% 的能量被浪费了。
图 5. 部分时钟周期时间为串行模式时,阿姆达尔定律对加速的影响。
真实的程序结构当然会更加复杂,部分组件允许在给定时刻使用不同数量的处理器。然而,周期性通信和同步的需求意味着大部分应用具备仅可高效使用一部分处理器的组件。尽管阿姆达尔定律已经出现 50 多年了,它仍然是一个很大的障碍。
随着登纳德缩放定律的终结,芯片内核数量的增加意味着能耗也随之增加。然而,进入处理器的电能肯定有一部分会转化为热能。因此多核处理器受限于热耗散功率(TDP),即封装和冷却系统可以移除的平均功率。尽管一些高端数据中心可能使用更先进的封装和冷却技术,但没有一个计算机用户想要在自己桌子上放置小型热交换器,或者背着散热器来冷却手机。TDP 的局限性直接导致了「暗硅」(dark silicon)时代,处理器得降低时钟速率、关闭空闲内核来防止过热。这种方法的另一种解释是:一些芯片可以重新分配其珍贵功耗,将其从空闲内核转移到活跃内核。
登纳德缩放定律结束、摩尔定律衰退,而阿姆达尔定律正当其时,这意味着低效性将每年的性能改进限制在几个百分点(见图 6)。获得更高的性能改进(像 20 世纪八九十年代那样)需要新的架构方法,新方法应能更加高效地利用集成电路。接下来我们将讨论现代计算机的另一个主要缺陷——计算机安全问题,之后我们会回来探讨有效的新方法。
图 6:使用整型程序得到的计算机性能提升(SPECintCPU)。
被忽略的计算机安全
20 世纪 70 年代,处理器架构师特别关注计算机安全,这涉及保护环、容量等概念。这些架构师深刻理解,大部分 bug 存在于软件中,但他们认为架构支持会有所帮助。然而,操作系统大部分并未使用这些功能,操作系统假设自己处于良性环境(如个人电脑),因此具备较大开销的功能未被使用。在软件社区中,很多人认为微内核(microkernel)和形式验证技术会为构建高度安全的软件提供有效保障。但不幸的是,我们的软件系统规模和性能驱动器意味着此类技术无法跟上处理器性能。结果就是大型软件系统仍然有很多安全漏洞,且由于海量在线个人信息和云计算的使用,其影响被放大。
登纳德缩放定律的终结意味着架构师必须找到利用并行化的更高效方式。
尽管计算机架构师等很晚才意识到安全的重要性,但他们已经开始对虚拟机和加密提供硬件支持。不幸的是,推测执行给许多处理器带来了一个未知但重要的安全缺陷。具体来看,Meltdown 和 Spectre 安全漏洞给微架构带来了新的缺陷,使受保护信息遭到泄露。这两种漏洞都使用了旁路攻击。2018 年,研究者展示了在攻击者不将代码加载到目标处理器的情况下,如何利用 Spectre 变体导致网络信息泄露。尽管这次名为 NetSpectre 的攻击泄露信息速度较慢,但它使同一局域网中的所有机器都受到攻击,这造成了很多新的难题。虚拟机架构还有两个漏洞。一个是 Foreshadow,会影响专门保护高风险数据(如加密密钥)的英特尔 SGX 安全机制。每个月都会发现新的漏洞。
旁路攻击并非新鲜事,但是在最早期的案例中,促使旁路攻击成功的是软件缺陷。而在 Meltdown、Spectre 等攻击中,硬件实现中的缺陷导致受保护信息泄露。这是处理器架构师定义什么是 ISA 正确实现的一个基本难题,因为标准定义中并未提及执行指令序列的性能影响,而仅仅涉及 ISA-visible 执行架构状态。架构师需要重新思考对 ISA 正确实现的定义,以避免此类安全漏洞。同时,他们还应该重新思考对计算机安全的侧重点,以及架构师如何与软件设计师一道实现更加安全的系统。架构师(以及每个人)都取决于信息系统在多大程度上容许安全问题的,而不是把安全作为第一优先级去考虑。
计算机架构的未来机遇
「我们的机遇就在那些『无解问题』之中。」——John Gardner, 1965
通用处理器固有的低效性,以及登纳德缩放定律和摩尔定律的终结,使得处理器架构师和设计师很可能无法继续维持通用处理器中的显著性能改进。鉴于改进性能对新的软件能力的重要性,我们必须问:有没有其他的有效方法?
现在有两个很明确的机会,把二者结合起来则是第三个机会。首先,现有的软件构建技术广泛使用具备动态类型和存储管理的高级语言。但是,此类语言的解释和执行通常非常低效。Leiserson 等人使用一个小例子(执行矩阵相乘)说明了这种低效性。如图 7 所示,简单地将 Python 语言代码重写为 C 代码就可以将性能提升 46 倍(Python 是典型的高级、动态类型语言)。
在多核上运行并行循环(parallel loops)又将性能提升接近 7 倍。优化内存配置又将性能提升了近 19 倍,而通过单指令多数据(SIMD)并行化操作(一个指令执行 16 个 32-bit 运算)的硬件扩展,性能又提升了 8 倍多。也就是说,最终的高度优化版本在多核英特尔处理器上的运行速度是初始 Python 版本的 62,000 多倍。这当然只是一个很小的例子,但我们会期望程序员使用优化库。尽管这夸大了常见的性能差距,但很多程序的性能差距可能达到 100 到 1000 倍。
图 7. Python 四次优化中矩阵乘法的潜在加速能力。
一个有趣的研究方向有关是否可以使用新的编译器技术来缩短性能差距(可以辅以体系架构增强)。尽管高效编译和实现 Python 这样的高级脚本语言比较困难,但潜在的收益是巨大的。即使实现 25% 的提升潜力,也能让 Python 程序的运行速度提升百倍。这个简单的例子展示了现代语言中强调程序员的生产力和传统方法强调性能之间的巨大差距。
特定领域的体系结构。一种更加以硬件为中心的设计思路是设计面向特定问题和领域的架构,并给与它们强大(且高效)的性能,因此它们是「特定领域的体系结构(DSA)」,这是一种特定领域的可编程处理器,通常是图灵完备的,但针对特定类别的应用进行了定制。从这个意义上来说,它们与专用集成电路(ASIC)不同,后者仅适用于单一功能,代码很少有变化。DSA 通常被称为加速器,因为与在通用 CPU 上执行整个应用程序相比,它们可以加速某些应用程序。此外,DSA 可以实现更好的性能,因为它们更贴近应用的实际需求;DSA 的例子包括图形加速单元(即 GPU),用于深度学习的神经网络处理器,以及软件定义处理器(SDN)。DSA 效率更高,能耗更低是因为以下四个原因:
首先最重要的是,DSA 为特定领域的计算使用了更加有效的并行形式。例如单指令多数据并行(SIMD)比多指令多数据(MIMD)更有效,因为它在一个时钟步长内只需处理一个指令流和处理单元。尽管 SIMD 相比 MIMD 没那么灵活,但前者适用于很多 DSA。DSA 也可以使用 VLIW 方法来实现 ILP,而不是推测性的乱序机制。如前文所述,VLIW 处理器与通用性代码不匹配,但对于有限领域更加有效,因为它的控制机制更加简单。特别是大多数高端通用处理器都是超标量的,需要复杂的控制逻辑来启动和完成指令。与之相对的是,VLIW 在编译时执行必要的分析和调度,这对于显式并行程序来说可以很好地工作。
第二,DSA 可以更有效地利用内存层次结构。如 Horowitz 所述,内存访问要比算数计算的成本高出很多。例如,访问 32 千字节缓存需要的能量相当于做 32 位加法的大约 200 倍。这种巨大的差异使得优化存储器访问对于实现高能效来说至关重要。通用处理器的运行代码,其中的存储器访问通常表现出空间和时间局部性,但在编译时不是非常可预测的。因此,CPU 使用多级高速缓存来增加带宽,并掩盖相对较慢的芯片外 DRAM 延迟。这些多级高速缓存以通常消耗大约一半的处理器能量的代价来几乎避免了所有片外 DRAM 访问,这些访问需要大约 10 倍于最后一级高速缓存访问的能量。
缓存有两大缺点:
当数据集非常大的时候,时间空间局部性较低时缓存的工作效率很低; 当缓存工作效率高的时候,局部性非常高,这意味着,根据定义,大多数缓存在大多数时间都处于空闲状态。
GPU:英伟达 GPU 使用了众核架构,每个核心都有大型寄存器文件、很多硬件线程和缓存; TPU:谷歌 TPU 依赖于大型二维脉动阵列和板载内存的硬件控制; FPGA:微软在其数据中心里部署了现场可编程门阵列器件(FPGA),专用于神经网络应用; CPU:英特尔提供通过大型高级缓存和一维 SIMD 指令增强的带有很多核心的 CPU,微软使用的 FPGA,以及一种新型的神经网络处理器,这种处理器相比 CPU 更加接近 TPU。
M. 整型数乘法/除法; A. 原子内存操作; F/D. 单/双精度浮点数; C. 压缩指令。